package com.itany.corejava.code16_反射;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;

/**
 * @author MissChen
 * @date 2024年03月26日 13:53
 */
public class Test03_Constructor {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        User user = new User();
        Class c = user.getClass();

        // 1.获取当前类中所有public修改的构造方法
        Constructor[] constructors = c.getConstructors();
        System.out.println(constructors);
        System.out.println(Arrays.toString(constructors));

        //2.获取当前类中所有的构造方法
        Constructor[] declaredConstructors = c.getDeclaredConstructors();
        System.out.println(Arrays.toString(declaredConstructors));

        //根据传递的参数不同,返回对应的由public修饰的构造方法
        // 方法参数是一个Class可变长参数。只返回public修饰的
        // Constructor constructor = c.getConstructor();
        // System.out.println(constructor);


        // 3.方法参数是一个Class可变长参数。只返回public修饰的
        // Constructor constructor = c.getConstructor(String.class);
        // System.out.println(constructor);

        Constructor constructor = c.getConstructor(String.class, String.class);
        System.out.println(constructor);

        System.out.println("----");

        // 4.根据传递的方法参数不同,返回对应的构造方法,其方法参数是一个Class
        // 类型的可变长参数。不区分修饰符
        Constructor privateConstructor = c.getDeclaredConstructor(String.class);
        System.out.println(privateConstructor);

        //通过反射来调用指定的构造方法创建对应的对象
        User u = (User) constructor.newInstance("admin", "123");
        System.out.println(u);


        //由于当前构造方法是private修饰的，外部无法访问，直接使用会报错
        //  setAccessible(true):取消权限控制检查, 访问忽略调用者的访问控制符,主要用于破坏封装原则
        privateConstructor.setAccessible(true);
        User u2 = (User) privateConstructor.newInstance("bb");
        System.out.println(u2);


    }
}
